/*
 Archivo ID_A*
 CODIGO
 */
#include "CNodo.h"
#include "ID_A.h"
#include "Heuristica.h"
#include <stdlib.h>
#include <stdio.h>

#define COSTO_MAX 512

CNodo *ID_A::DFSID_A(CNodo *s, int cost, int prof, Heuristica *heu, int *n_prof) {

    *n_prof = cost + heu->h(s);

    if (*n_prof > prof) return NULL;

    if (s->EsGoal()) {
        *n_prof = prof;
        return s;
    }


    {
        int t1, i, new_t = COSTO_MAX;

        for (i = 0; i < 4; i++) {
            
            if(CNodo::operadoresInv[i] == s->OperadorEnlace()) continue;
            
            CNodo *suc = s->GenerarSucesor(CNodo::operadores[i]);
            
            if (suc) {
                //llamada recursiva
                CNodo *res = DFSID_A(suc, cost + 1, prof, heu, &t1);

                if (res) return res;
                
                //minimo entre dos numeros
                if (new_t > t1) new_t = t1;
                delete suc;
            }
        }

        *n_prof = new_t;
        return NULL;
    }

}


//esta funcion recibe como parametro el s0 que es la raiz del arbol

CNodo *ID_A::Driver(CNodo *s0, Heuristica *heu) {
    int t, t1;
    CNodo *result;

    t = heu->h(s0);

    while (true) {
        result = DFSID_A(s0, 0, t, heu, &t1);
        t = t1;
        fflush(stdout);
        if (result) break;
        if (t1 >= COSTO_MAX) {
            result = NULL;
            break;
        }
    }

    //Crear lista o arreglo de Operaciones...
    return result;


}
